aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/core_lib.erl
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2014-04-02 17:00:43 +0200
committerBjörn-Egil Dahlberg <[email protected]>2014-04-03 14:32:44 +0200
commitcc7a3c5896bc266bb97287dd4e31b696d8cf604f (patch)
treed19e07f7b30e2723184e1789f9113f6060428a15 /lib/compiler/src/core_lib.erl
parenteba291a52d4a78c128c5802775fa1bff187e0604 (diff)
downloadotp-cc7a3c5896bc266bb97287dd4e31b696d8cf604f.tar.gz
otp-cc7a3c5896bc266bb97287dd4e31b696d8cf604f.tar.bz2
otp-cc7a3c5896bc266bb97287dd4e31b696d8cf604f.zip
compiler,stdlib: Fix Map literals as keys for Maps in patterns
Diffstat (limited to 'lib/compiler/src/core_lib.erl')
-rw-r--r--lib/compiler/src/core_lib.erl11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/compiler/src/core_lib.erl b/lib/compiler/src/core_lib.erl
index 93ec3bbad5..2792fd8fa5 100644
--- a/lib/compiler/src/core_lib.erl
+++ b/lib/compiler/src/core_lib.erl
@@ -59,7 +59,7 @@ is_lit_bin(Es) ->
%% Return the value of LitExpr.
-spec literal_value(cerl:c_literal() | cerl:c_binary() |
- cerl:c_cons() | cerl:c_tuple()) -> term().
+ cerl:c_map() | cerl:c_cons() | cerl:c_tuple()) -> term().
literal_value(#c_literal{val=V}) -> V;
literal_value(#c_binary{segments=Es}) ->
@@ -67,7 +67,14 @@ literal_value(#c_binary{segments=Es}) ->
literal_value(#c_cons{hd=H,tl=T}) ->
[literal_value(H)|literal_value(T)];
literal_value(#c_tuple{es=Es}) ->
- list_to_tuple(literal_value_list(Es)).
+ list_to_tuple(literal_value_list(Es));
+literal_value(#c_map{arg=Cm,es=Cmps}) ->
+ M = literal_value(Cm),
+ lists:foldl(fun(#c_map_pair{ key=Ck, val=Cv },Mi) ->
+ K = literal_value(Ck),
+ V = literal_value(Cv),
+ maps:put(K,V,Mi)
+ end, M, Cmps).
literal_value_list(Vals) -> [literal_value(V) || V <- Vals].