Improve constraint solving #971
@ -154,7 +154,6 @@
|
|||||||
, in_pattern = false :: boolean()
|
, in_pattern = false :: boolean()
|
||||||
, in_guard = false :: boolean()
|
, in_guard = false :: boolean()
|
||||||
, stateful = false :: boolean()
|
, stateful = false :: boolean()
|
||||||
, unify_throws = true :: boolean()
|
|
||||||
, current_const = none :: none | aeso_syntax:id()
|
, current_const = none :: none | aeso_syntax:id()
|
||||||
, current_function = none :: none | aeso_syntax:id()
|
, current_function = none :: none | aeso_syntax:id()
|
||||||
, what = top :: top | namespace | contract | contract_interface
|
, what = top :: top | namespace | contract | contract_interface
|
||||||
@ -3075,15 +3074,10 @@ unify1(_Env, {uvar, _, R}, {uvar, _, R}, _Variance, _When) ->
|
|||||||
unify1(_Env, {uvar, _, _}, {fun_t, _, _, var_args, _}, _Variance, When) ->
|
unify1(_Env, {uvar, _, _}, {fun_t, _, _, var_args, _}, _Variance, When) ->
|
||||||
type_error({unify_varargs, When}),
|
type_error({unify_varargs, When}),
|
||||||
false;
|
false;
|
||||||
unify1(Env, {uvar, A, R}, T, _Variance, When) ->
|
unify1(_Env, {uvar, A, R}, T, _Variance, When) ->
|
||||||
case occurs_check(R, T) of
|
case occurs_check(R, T) of
|
||||||
true ->
|
true ->
|
||||||
if
|
cannot_unify({uvar, A, R}, T, none, When),
|
||||||
Env#env.unify_throws ->
|
|
||||||
cannot_unify({uvar, A, R}, T, none, When);
|
|
||||||
true ->
|
|
||||||
ok
|
|
||||||
end,
|
|
||||||
false;
|
false;
|
||||||
false ->
|
false ->
|
||||||
ets_insert(type_vars, {R, T}),
|
ets_insert(type_vars, {R, T}),
|
||||||
@ -3110,18 +3104,13 @@ unify1(Env, A = {con, _, NameA}, B = {con, _, NameB}, Variance, When) ->
|
|||||||
case is_subtype(Env, NameA, NameB, Variance) of
|
case is_subtype(Env, NameA, NameB, Variance) of
|
||||||
true -> true;
|
true -> true;
|
||||||
false ->
|
false ->
|
||||||
if
|
IsSubtype = is_subtype(Env, NameA, NameB, contravariant) orelse
|
||||||
Env#env.unify_throws ->
|
is_subtype(Env, NameA, NameB, covariant),
|
||||||
IsSubtype = is_subtype(Env, NameA, NameB, contravariant) orelse
|
Cxt = case IsSubtype of
|
||||||
is_subtype(Env, NameA, NameB, covariant),
|
true -> Variance;
|
||||||
Cxt = case IsSubtype of
|
false -> none
|
||||||
true -> Variance;
|
end,
|
||||||
false -> none
|
cannot_unify(A, B, Cxt, When),
|
||||||
end,
|
|
||||||
cannot_unify(A, B, Cxt, When);
|
|
||||||
true ->
|
|
||||||
ok
|
|
||||||
end,
|
|
||||||
false
|
false
|
||||||
end;
|
end;
|
||||||
unify1(_Env, {qid, _, Name}, {qid, _, Name}, _Variance, _When) ->
|
unify1(_Env, {qid, _, Name}, {qid, _, Name}, _Variance, _When) ->
|
||||||
@ -3170,13 +3159,8 @@ unify1(Env, {app_t, _, T, []}, B, Variance, When) ->
|
|||||||
unify0(Env, T, B, Variance, When);
|
unify0(Env, T, B, Variance, When);
|
||||||
unify1(Env, A, {app_t, _, T, []}, Variance, When) ->
|
unify1(Env, A, {app_t, _, T, []}, Variance, When) ->
|
||||||
unify0(Env, A, T, Variance, When);
|
unify0(Env, A, T, Variance, When);
|
||||||
unify1(Env, A, B, _Variance, When) ->
|
unify1(_Env, A, B, _Variance, When) ->
|
||||||
if
|
cannot_unify(A, B, none, When),
|
||||||
Env#env.unify_throws ->
|
|
||||||
cannot_unify(A, B, none, When);
|
|
||||||
true ->
|
|
||||||
ok
|
|
||||||
end,
|
|
||||||
false.
|
false.
|
||||||
|
|
||||||
is_subtype(_Env, NameA, NameB, invariant) ->
|
is_subtype(_Env, NameA, NameB, invariant) ->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user