mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-21 00:39:37 +00:00
Estimated hours taken: 80 Branches: main Extend constrained polymorphic modes to allow inst parameters to be constrained to insts other than `ground'. The main motivation for this is that for HAL we want inst parameters constrained to `any', however this change is more general and allows inst parameters to be constrained to any valid inst. Introduce the syntax `InstParam =< Inst' to constrain an inst parameter `InstParam' to an inst `Inst' in a predicate or function mode declaration. compiler/inst.m: Add a new alternative `constrained_inst_var(inst_var, inst)' to the `inst' type. Remove `constrained_inst_var(inst_var)' alternative from the `ground_inst_info' type. compiler/inst_match.m: compiler/inst_util.m: compiler/modecheck_unify.m: Make changes required to the core mode checking algorithms to handle the change. compiler/prog_io.m: compiler/prog_io_util.m: compiler/prog_io_goal.m: compiler/prog_io_pragma.m: compiler/prog_io_typeclass.m: compiler/make_hlds.m: Add support for `=<'/2 insts, but only when parsing predicate and function mode declarations, lambda argument modes, and pragmas. Also add support for specifying inst constraints in the constraints list for a declaration. Make sure any unconstrained inst parameters in these declarations are constrained to be `ground'. Check that all constraints for a declaration are consistent, i.e. the same constraint for every occurrence of an inst parameter. compiler/hlds_out.m: compiler/mercury_to_mercury.m: Support printing of `=<'/2 insts. compiler/mode_util.m: compiler/module_qual.m: compiler/pd_util.m: compiler/recompilation_usage.m: Handle the changes to the definition of the `inst' type. doc/reference_manual.texi: Document the change. tests/valid/Mmakefile: tests/valid/constrained_poly_insts.m: tests/invalid/Mmakefile: tests/invalid/constrained_poly_insts.m: Add some test cases.
28 lines
509 B
Mathematica
28 lines
509 B
Mathematica
:- module constrained_poly_insts.
|
|
:- interface.
|
|
|
|
% Test that inconsistent declarations are not allowed.
|
|
|
|
:- pred p(T, T).
|
|
:- mode p(in(I), out(I =< any)) is det.
|
|
|
|
:- pred q(T::in(I =< free), T::out(I =< bound(c))) is det.
|
|
|
|
:- func r(T) = T.
|
|
:- mode r(in(I)) = out(I =< free) is det.
|
|
|
|
:- func s(T::in(I =< ground)) = (T::out(I =< unique)) is det.
|
|
|
|
% Test that mode errors are detected correctly.
|
|
|
|
:- pred t(int::in(I), int::out(I)) is det.
|
|
|
|
:- implementation.
|
|
|
|
p(X, X).
|
|
q(X, X).
|
|
r(X) = X.
|
|
s(X) = X.
|
|
|
|
t(_, 42).
|