Skip to content

Commit fd564a4

Browse files
authored
Merge pull request #571 from erszcz/skip-maybe
Skip functions using maybe expr, don't crash on maybe ... else
2 parents c44e393 + b3445fb commit fd564a4

File tree

5 files changed

+112
-23
lines changed

5 files changed

+112
-23
lines changed

src/typechecker.erl

+16-3
Original file line numberDiff line numberDiff line change
@@ -2215,8 +2215,12 @@ do_type_check_expr(Env, {'try', _, Block, CaseCs, CatchCs, AfterBlock}) ->
22152215

22162216
%% Maybe - value-based error handling expression
22172217
%% See https://www.erlang.org/eeps/eep-0049
2218-
do_type_check_expr(_Env, {'maybe', Anno, [{maybe_match, _, _LHS, _RHS}]} = MaybeExpr) ->
2219-
erlang:throw({unsupported_expression, Anno, MaybeExpr}).
2218+
do_type_check_expr(Env, {'maybe', _, _}) ->
2219+
%% TODO: handle maybe expr properly
2220+
{type(any), Env};
2221+
do_type_check_expr(Env, {'maybe', _, _, {'else', _, _}}) ->
2222+
%% TODO: handle maybe expr properly
2223+
{type(any), Env}.
22202224

22212225
%% Helper for type_check_expr for funs
22222226
-spec type_check_fun(env(), _) -> {type(), env()}.
@@ -3073,7 +3077,16 @@ do_type_check_expr_in(Env, ResTy, {'try', _, Block, CaseCs, CatchCs, AfterBlock}
30733077
end,
30743078
%% no variable bindings are propagated from a try expression
30753079
%% as that would be "unsafe"
3076-
Env.
3080+
Env;
3081+
3082+
%% Maybe - value-based error handling expression
3083+
%% See https://www.erlang.org/eeps/eep-0049
3084+
do_type_check_expr_in(_Env, _ResTy, {'maybe', _, _}) ->
3085+
%% TODO: handle maybe expr properly
3086+
erlang:throw({skip, maybe_expr_not_supported});
3087+
do_type_check_expr_in(_Env, _ResTy, {'maybe', _, _, {'else', _, _}}) ->
3088+
%% TODO: handle maybe expr properly
3089+
erlang:throw({skip, maybe_expr_not_supported}).
30773090

30783091
-spec type_check_arith_op_in(env(), type(), _, _, _, _) -> env().
30793092
type_check_arith_op_in(Env, ResTy, Op, P, Arg1, Arg2) ->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
-module(maybe_expr_should_fail).
2+
3+
-ifdef(OTP_RELEASE).
4+
-if(?OTP_RELEASE >= 25).
5+
-if(?FEATURE_AVAILABLE(maybe_expr)).
6+
7+
-feature(maybe_expr, enable).
8+
9+
-export([check1/0, check2/0]).
10+
-export([infer1/0, infer2/1]).
11+
12+
-spec check1() -> integer().
13+
check1() ->
14+
maybe
15+
ok ?= ok,
16+
"one"
17+
end.
18+
19+
-spec check2() -> integer().
20+
check2() ->
21+
maybe
22+
ok ?= not_ok,
23+
one
24+
else
25+
_ -> "two"
26+
end.
27+
28+
-spec infer1() -> integer().
29+
infer1() ->
30+
R = maybe
31+
ok ?= ok
32+
end,
33+
R.
34+
35+
-spec infer2(string()) -> integer().
36+
infer2(Val) ->
37+
R = maybe
38+
ok ?= Val
39+
else
40+
_ -> ok
41+
end,
42+
R.
43+
44+
-endif. %% FEATURE_AVAILABLE
45+
-endif. %% OTP >= 25
46+
-endif. %% OTP_RELEASE

test/known_problems/should_pass/maybe_expr.erl

-18
This file was deleted.

test/should_pass/binary_literal_pattern.erl

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
-export([f/1]).
44

55
-type t1() :: binary().
6-
-type maybe(T) :: undefined | T.
6+
-type option(T) :: undefined | T.
77

8-
-spec f(maybe(t1())) -> ok | error | other.
8+
-spec f(option(t1())) -> ok | error | other.
99
f(T) ->
1010
case T of
1111
undefined -> error;

test/should_pass/maybe_expr_pass.erl

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
-module(maybe_expr_pass).
2+
3+
-ifdef(OTP_RELEASE).
4+
-if(?OTP_RELEASE >= 25).
5+
-if(?FEATURE_AVAILABLE(maybe_expr)).
6+
7+
-feature(maybe_expr, enable).
8+
9+
-export([check1/0, check2/0]).
10+
-export([infer1/0, infer2/1]).
11+
12+
-spec check1() -> integer().
13+
check1() ->
14+
maybe
15+
ok ?= ok,
16+
1
17+
end.
18+
19+
-spec check2() -> integer().
20+
check2() ->
21+
maybe
22+
ok ?= not_ok,
23+
1
24+
else
25+
_ -> 2
26+
end.
27+
28+
-spec infer1() -> integer().
29+
infer1() ->
30+
R = maybe
31+
ok ?= ok,
32+
1
33+
end,
34+
R.
35+
36+
-spec infer2(string()) -> {ok, string()} | error.
37+
infer2(Val) ->
38+
R = maybe
39+
"ok" ?= Val,
40+
{ok, Val}
41+
else
42+
_ -> error
43+
end,
44+
R.
45+
46+
-endif. %% FEATURE_AVAILABLE
47+
-endif. %% OTP >= 25
48+
-endif. %% OTP_RELEASE

0 commit comments

Comments
 (0)