mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-24 13:53:54 +00:00
compiler/modecheck_coerce.m:
Handle tuple_cons cons_id when modechecking coerce instead of
throwing an exception.
tests/invalid/Mmakefile:
tests/invalid/coerce_tuple.err_exp:
tests/invalid/coerce_tuple.m:
Add test case.
56 lines
1.2 KiB
Mathematica
56 lines
1.2 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module coerce_tuple.
|
|
:- interface.
|
|
|
|
:- type fruit
|
|
---> apple
|
|
; orange
|
|
; lemon.
|
|
|
|
:- type citrus =< fruit
|
|
---> orange
|
|
; lemon.
|
|
|
|
:- type basket(T)
|
|
---> basket({int, string}, {T, T}).
|
|
|
|
:- type citrus_basket =< basket(fruit)
|
|
---> basket({int, string}, {citrus, citrus}).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- pred bad1 is det.
|
|
|
|
bad1 :-
|
|
X = basket({1, "two"}, {lemon, apple}),
|
|
coerce(X) = _ : basket(citrus).
|
|
|
|
:- pred bad2 is det.
|
|
|
|
bad2 :-
|
|
X = basket({1, "two"}, {lemon, apple}),
|
|
coerce(X) = _ : citrus_basket.
|
|
|
|
:- pred ok3 is det.
|
|
|
|
ok3 :-
|
|
X = basket({1, "two"}, {orange, lemon : fruit}),
|
|
coerce(X) = _ : basket(citrus).
|
|
|
|
:- pred ok4 is det.
|
|
|
|
ok4 :-
|
|
X = basket({1, "two"}, {orange, lemon}) : citrus_basket,
|
|
coerce(X) = _ : basket(fruit).
|
|
|
|
:- pred ok5 is det.
|
|
|
|
ok5 :-
|
|
X = basket({1, "two"}, {orange, lemon}) : citrus_basket,
|
|
coerce(X) = _ : basket(citrus).
|