Skip to content
19 changes: 19 additions & 0 deletions test/known_problems/should_fail/type_refinement_should_fail.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-module(type_refinement_should_fail).

-export([pattern_prevents_refinement/2]).

-spec guard_prevents_refinement(1..2, boolean()) -> 2.
guard_prevents_refinement(N, Guard) ->
case N of
1 when Guard -> 2;
M -> M %% 1 cannot be eliminated
end.

-spec guard_prevents_refinement2(erlang:timestamp()) -> ok.
guard_prevents_refinement2(X) when is_integer(X), X rem 7 == 0 -> ok;
guard_prevents_refinement2(infinity) -> ok. % can still be an integer

-spec pattern_prevents_refinement(erlang:timestamp(), any()) -> atom().
pattern_prevents_refinement(X, X) when is_integer(X) -> ok;
pattern_prevents_refinement(X, {_Y}) when is_integer(X) -> ok;
pattern_prevents_refinement(Inf, _) -> Inf. % Inf can still be an integer
21 changes: 2 additions & 19 deletions test/should_fail/type_refinement_fail.erl
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
-module(type_refinement_fail).
-export([guard_prevents_refinement/2, imprecision_prevents_refinement/2,
multi_pat_fail_1/2,
guard_prevents_refinement2/1,
pattern_prevents_refinement/2]).

-spec guard_prevents_refinement(1..2, boolean()) -> 2.
guard_prevents_refinement(N, Guard) ->
case N of
1 when Guard -> 2;
M -> M %% 1 cannot be eliminated
end.
-export([imprecision_prevents_refinement/2,
multi_pat_fail_1/2]).

-spec imprecision_prevents_refinement(float(), a|b) -> b.
imprecision_prevents_refinement(3.14, a) -> b;
Expand All @@ -18,12 +10,3 @@ imprecision_prevents_refinement(_, X) -> X.
-spec multi_pat_fail_1(a|b, a|b) -> {b, b}.
multi_pat_fail_1(a, a) -> {b, b};
multi_pat_fail_1(A, B) -> {A, B}. %% Not only {b, b} here

-spec guard_prevents_refinement2(erlang:timestamp()) -> ok.
guard_prevents_refinement2(X) when is_integer(X), X rem 7 == 0 -> ok;
guard_prevents_refinement2(infinity) -> ok. % can still be an integer

-spec pattern_prevents_refinement(erlang:timestamp(), any()) -> atom().
pattern_prevents_refinement(X, X) when is_integer(X) -> ok;
pattern_prevents_refinement(X, {_Y}) when is_integer(X) -> ok;
pattern_prevents_refinement(Inf, _) -> Inf. % Inf can still be an integer