This repository has been archived by the owner on May 15, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 16
/
shadow_var.erlt
71 lines (58 loc) · 1.62 KB
/
shadow_var.erlt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
%% Copyright (c) Facebook, Inc. and its affiliates.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
-module(shadow_var).
%% Don't warn about normal shadowing in funs and comprehensions
-compile(nowarn_shadow_vars).
-export([f/2, g/2]).
-export([test1/2, test2/2, test3/2]).
-struct str :: (
id :: any()
).
-enum ab(A, B) :: (
a{a :: A},
b{b :: B}
).
%% Error: bound variables without caret implies shadowing -
%% this is not allowed in normal patterns
f(X, Y) ->
{'ok', Y} = X,
case X of
{'ok', Y} -> true;
_ -> false
end.
g(X, Y) ->
%% List comprehension generators may shadow variables
L = [X || {'foo', X} <- Y],
%% Fun heads may shadow variables
F = fun(X, Y) -> X + Y end,
foldl(F, L, X).
test1(X, Y) ->
case X of
{Y} -> true
end.
test2(X, Y) ->
case X of
#str{id = Y} -> true
end.
test3(X, Y) ->
case X of
ab.a{a = Y} -> true
end.
%% stub
foldl(_, Acc, _) -> Acc.
-spec f(_X, _Y) -> boolean().
-spec g(_X, [{A,B}]) -> [B].
-spec test1(_X, _Y) -> boolean().
-spec test2(_X, _Y) -> boolean().
-spec test3(_X, _Y) -> boolean().