diff options
author | Björn Gustavsson <[email protected]> | 2018-04-19 14:07:42 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-04-19 14:07:42 +0200 |
commit | 0e831fff602e9c13471d4833a0e78c94020a86b6 (patch) | |
tree | 93cd824883e57a416e3d02e78b07ceaf48ca3f74 /lib/compiler/src | |
parent | 060d1982d93b83c142e594a88433c4cf80032533 (diff) | |
parent | 6626b2a4ac67631bef3144bf9eca41b5f49c3176 (diff) | |
download | otp-0e831fff602e9c13471d4833a0e78c94020a86b6.tar.gz otp-0e831fff602e9c13471d4833a0e78c94020a86b6.tar.bz2 otp-0e831fff602e9c13471d4833a0e78c94020a86b6.zip |
Merge branch 'bjorn/compiler/core_lint'
* bjorn/compiler/core_lint:
core_lint: Handle repeated variables in map patterns correctly
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}. |