diff options
author | Björn Gustavsson <[email protected]> | 2018-06-27 13:48:21 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-06-27 14:01:52 +0200 |
commit | c221bb38a80f8c3c4263ebdd609ff8ae6e5d117f (patch) | |
tree | ae6c51ad3bde8c727a2bd4b533b974550d389f92 /lib/compiler/src | |
parent | a0ae44f324576104760a63fe6cf63e0ca31756fc (diff) | |
download | otp-c221bb38a80f8c3c4263ebdd609ff8ae6e5d117f.tar.gz otp-c221bb38a80f8c3c4263ebdd609ff8ae6e5d117f.tar.bz2 otp-c221bb38a80f8c3c4263ebdd609ff8ae6e5d117f.zip |
Fix internal compiler error for map_get/2
Code such as that the following:
Val = map_get(a, Map),
Map#{a:=z} %Could be any map update
would incorrectly cause an internal consistency check failure:
Internal consistency check failed - please report this bug.
Instruction: {put_map_exact,{f,0},{x,0},{x,0},1,{list,[{atom,a},{atom,z}]}}
Error: {bad_type,{needed,map},{actual,term}}:
Update beam_validator so that it understands that the second
argument for map_get/2 is a map.
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_validator.erl | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index b03fadb197..a1b71251b7 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -546,6 +546,12 @@ valfun_4({bif,raise,{f,0},Src,_Dst}, Vst) -> kill_state(Vst); valfun_4(raw_raise=I, Vst) -> call(I, 3, Vst); +valfun_4({bif,map_get,{f,Fail},[_Key,Map]=Src,Dst}, Vst0) -> + validate_src(Src, Vst0), + Vst1 = branch_state(Fail, Vst0), + Vst = set_type(map, Map, Vst1), + Type = propagate_fragility(term, Src, Vst), + set_type_reg(Type, Dst, Vst); valfun_4({bif,Op,{f,Fail},Src,Dst}, Vst0) -> validate_src(Src, Vst0), Vst = branch_state(Fail, Vst0), |