diff options
author | Björn Gustavsson <[email protected]> | 2018-04-12 15:05:28 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-04-18 15:26:11 +0200 |
commit | 6626b2a4ac67631bef3144bf9eca41b5f49c3176 (patch) | |
tree | 6c7c2fc8135dc2975fc6b21b8eac245a7d9dbb74 /lib/compiler/src | |
parent | 46a89739ebe59bb2d2b44639c9ea9869757d4b58 (diff) | |
download | otp-6626b2a4ac67631bef3144bf9eca41b5f49c3176.tar.gz otp-6626b2a4ac67631bef3144bf9eca41b5f49c3176.tar.bz2 otp-6626b2a4ac67631bef3144bf9eca41b5f49c3176.zip |
core_lint: Handle repeated variables in map patterns correctly
Keys in map patterns are input variables, not pattern variables.
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/core_lint.erl | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/compiler/src/core_lint.erl b/lib/compiler/src/core_lint.erl index 6e2114be56..6ded8fe78f 100644 --- a/lib/compiler/src/core_lint.erl +++ b/lib/compiler/src/core_lint.erl @@ -491,8 +491,10 @@ pattern(#c_tuple{es=Es}, Def, Ps, St) -> pattern_list(Es, Def, Ps, St); pattern(#c_map{es=Es}, Def, Ps, St) -> pattern_list(Es, Def, Ps, St); -pattern(#c_map_pair{op=#c_literal{val=exact},key=K,val=V},Def,Ps,St) -> - pattern_list([K,V],Def,Ps,St); +pattern(#c_map_pair{op=#c_literal{val=exact},key=K,val=V}, Def, Ps, St) -> + %% The key is an input. + pat_map_expr(K, Def, St), + pattern_list([V],Def,Ps,St); pattern(#c_binary{segments=Ss}, Def, Ps, St0) -> St = pat_bin_tail_check(Ss, St0), pat_bin(Ss, Def, Ps, St); @@ -555,6 +557,10 @@ pat_bit_expr(#c_binary{}, _, _Def, St) -> pat_bit_expr(_, _, _, St) -> add_error({illegal_expr,St#lint.func}, St). +pat_map_expr(#c_var{name=N}, Def, St) -> expr_var(N, Def, St); +pat_map_expr(#c_literal{}, _Def, St) -> St; +pat_map_expr(_, _, St) -> add_error({illegal_expr,St#lint.func}, St). + %% pattern_list([Var], Defined, State) -> {[PatVar],State}. %% pattern_list([Var], Defined, [PatVar], State) -> {[PatVar],State}. |